<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 闭包概念： 闭包就是能够读取其他函数内部变量的函数 -->
    <!-- 
        它的最大用处有两个
        一个是前面提到的可以读取函数内部的变量
        另一个就是让这些变量的值始终保持在内存中。
     -->
    <script>
        function fn1 (){
            var a = 20;
            function fn2(){
                console.log(a);
            }
            return fn2;
        }
        // 执行函数 获取返回值fn2
        var res = fn1();
        res();   //执行FN2可以访问到函数内部的变量


        // 下面演示 保存函数内部变量
        function fn2 (){
            var num  = 999;
            // 全局变量fn3
            fn3 = function (){
                num ++;
            }
            function fn4 (){
                console.log(num);
            }
            return fn4;
        }

        // 执行fn2函数，并且返回fn4 赋值给res2 其中fn4就是闭包函数
        var res2  = fn2();
        // 执行fn4 num=999
        res2();
        /* 
        num++ num =1000 num变量并没有弹栈
        为什么没有弹栈？
        fn2是fn4的父级函数，由于fn4被赋值给了一个全局变量，fn4就一直存在内存中，父函数fn2自然也一直在内存之中
         */
        fn3();
        // 再执行fn4
        res2(); //num =1000


        
    </script>
</body>
</html>